use thiserror::Error;

#[derive(Error, Debug)]
pub enum ManagerError {
    #[error("TLS错误: {0}")]
    TlsError(#[from] rustls::Error),

    #[error("IO错误: {0}")]
    IoError(#[from] std::io::Error),

    #[error("序列化错误: {0}")]
    SerializationError(#[from] serde_json::Error),

    #[error("网络错误: {0}")]
    NetworkError(String),

    #[error("认证错误: {0}")]
    AuthenticationError(String),

    #[error("配置错误: {0}")]
    ConfigError(String),

    #[error("命令执行错误: {0}")]
    CommandExecutionError(String),

    #[error("文件传输错误: {0}")]
    FileTransferError(String),

    #[error("节点不存在: {0}")]
    NodeNotFound(String),

    #[error("分组不存在: {0}")]
    GroupNotFound(String),

    #[error("超时错误: {0}")]
    TimeoutError(String),

    #[error("证书错误: {0}")]
    CertificateError(String),

    #[error("连接错误: {0}")]
    ConnectionError(String),

    #[error("存储错误: {0}")]
    StorageError(String),

    #[error("缓存错误: {0}")]
    CacheError(String),

    #[error("消息队列错误: {0}")]
    MessageQueueError(String),

    #[error("数据库错误: {0}")]
    DatabaseError(#[from] sqlx::Error),

    #[error("Redis错误: {0}")]
    RedisError(#[from] redis::RedisError),

    #[error("Pulsar错误: {0}")]
    PulsarError(String),

    #[error("HTTP错误: {0}")]
    HttpError(String),

    #[error("验证错误: {0}")]
    ValidationError(String),

    #[error("权限错误: {0}")]
    PermissionError(String),

    #[error("资源不存在: {0}")]
    ResourceNotFound(String),

    #[error("资源已存在: {0}")]
    ResourceAlreadyExists(String),

    #[error("状态错误: {0}")]
    StateError(String),

    #[error("内部错误: {0}")]
    InternalError(String),
}

// 移除错误的循环引用，直接使用ManagerError作为主要错误类型

pub type Result<T> = std::result::Result<T, ManagerError>;

// 为其他错误类型实现转换
impl From<tokio::task::JoinError> for ManagerError {
    fn from(err: tokio::task::JoinError) -> Self {
        ManagerError::InternalError(format!("任务执行错误: {}", err))
    }
}

impl From<std::net::AddrParseError> for ManagerError {
    fn from(err: std::net::AddrParseError) -> Self {
        ManagerError::ConfigError(format!("地址解析错误: {}", err))
    }
}

impl From<uuid::Error> for ManagerError {
    fn from(err: uuid::Error) -> Self {
        ManagerError::ValidationError(format!("UUID错误: {}", err))
    }
}

impl From<chrono::ParseError> for ManagerError {
    fn from(err: chrono::ParseError) -> Self {
        ManagerError::ValidationError(format!("时间解析错误: {}", err))
    }
} 